const espAi = require("esp-ai"); 
const config = { 
    /**
     * 可以根据业务需求用这个方法去库中请求配置等...
     * 客户端配置生成，主要是生成 IAT/LLM/TTS 配置。客户端首次连接时会执行或者在某个空闲时刻内部会有自动更新策略 
     * @param {object} params 参数为客户端中配置的参数， 这里会解析为字面量对象，开发者直接使用 key 方式引用即可。 
     */
    gen_client_config: (params)=>{
        return { 
            iat_server: "xun_fei",
            // iat_server: "esp-ai-plugin-iat-example", // 插件
            iat_config: {
                // 讯飞：https://console.xfyun.cn/services/iat  。打开网址后，右上角三个字段复制进来即可。
                appid: "${appid}",
                apiSecret: "${apiSecret}",
                apiKey: "${apiKey}", 
                // 静默时间，多少时间检测不到说话就算结束，单位 ms
                vad_eos: 1500,

            },

            llm_server: "xun_fei",
            
            llm_config: {
                // 讯飞：https://console.xfyun.cn/services/iat  。打开网址后，右上角三个字段复制进来即可。
                appid: "${appid}",
                apiSecret: "${apiSecret}",
                apiKey: "${apiKey}",
                llm: "v4.0",
            },

            tts_server: "xun_fei",
            
            tts_config: {
                // 讯飞：https://console.xfyun.cn/services/iat  。打开网址后，右上角三个字段复制进来即可。
                appid: "${appid}",
                apiSecret: "${apiSecret}",
                apiKey: "${apiKey}",


                
            },
            
            /**
             * LLM 初始化提示词
            */
            llm_init_messages: [
                { role: 'system', content: '你是小明同学，是一个无所不能的智能助手。' },
            ],

            
            /**
             * 意图表：当用户唤醒 小明同学 后，小明同学可以做下面的任务
            */
            intention: [
                {
                    // 关键词
                    key: ["帮我开灯", "开灯", "打开灯"],
                    // 向客户端发送的指令
                    instruct: "device_open_001",
                    message: "开啦！还有什么需要帮助的吗？"
                },
                {
                    // 关键词
                    key: ["帮我关灯", "关灯", "关闭灯"],
                    // 向客户端发送的指令
                    instruct: "device_close_001",
                    message: "关啦！还有什么需要帮助的吗？"
                },
                {
                    // 关键词
                    key: ["退下吧", "退下"],
                    // 内置的睡眠指令
                    instruct: "__sleep__",
                    message: "我先退下了，有需要再叫我。"
                }, 
                {
                    /**
                     * 正则匹配
                     * 如：播放音乐最后的倔强  
                     * 返回匹配的字符串为匹配成功
                    */
                    key: async (text = "", llm_historys) => {
                        const regex = /^(播放音乐)(.*)$/;
                        const match = text.match(regex);
                        if (match) {
                            const songName = match[2];
                            console.log("音乐名称:", songName);
                            return songName;
                        } else {
                            return false;
                        }
                    },
                    // 向客户端发送的指令
                    instruct: "__play_music__",
                    message: "好的！",
                    /**
                     * 用于返回音频地址和播放进度
                     * 目前只支持 mp3、wav 格式
                     * @param {String} name 是歌曲名称
                     * @return {number} seek 进度： （以秒为单位）
                     * @return {message} 找不到数据时的TTS
                    */ 
                    music_server: async (name, { user_config }) => { 
                        return {
                            url:"[https](https://xiaomingio.top/music.mp3)",
                            seek: 0,
                            message: message
                        };
                    },
                    /**
                     * 当音频结束后的回调
                     * @param {object} arg.break_second  停止时的进度，单位秒。也就是用户播放了到了多少秒（seek+play_time）
                     * @param {object} arg.play_time     实际播放音频的时间，单位秒。
                     * @param {object} arg.seek          音频开始播放时间，其实也就是 music_server 函数中返回的 seek 值
                     * @param {object} arg.start_time    开始播放音频的 Unix 毫秒数时间戳
                     * @param {object} arg.end_time      结束播放音频的 Unix 毫秒数时间戳
                     * @param {object} arg.event         结束原因： "user_break" 用户打断 | play_end 播放完毕 | foo 未知事件 
                    */
                    on_end: (arg) => {
                        // 请求业务服务器保存进度信息...
                        console.log(arg);
                    }
                },
            ],
        }
    }
}
espAi(config);